﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using FastOdonto.Data.Entity;
using System.Data;

namespace Contract.Data.Manager
{
    public class DMConfiguracao : DMGeneric<BEConfiguracao, FEConfiguracao>
    {
        DBFastOdontoEntities2 dc;

        #region Override

        public override BEConfiguracao Salvar(BEConfiguracao entidade)
        {
            try
            {
                if (entidade.Codigo.Equals(0))
                    Incluir(entidade);
                else
                    Alterar(entidade);

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BEConfiguracao entidade)
        {
            try
            {
                TBConfig entidadeBanco = new TBConfig();
                entidadeBanco.ConvertFromBE(entidade);

                using (dc = new DBFastOdontoEntities2())
                {
                    dc.TBConfigs.Attach(entidadeBanco);
                    dc.DeleteObject(entidadeBanco);

                    dc.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BEConfiguracao ObterEntidade(int codigo)
        {
            try
            {
                TBConfig obj = null;
                using (dc = new DBFastOdontoEntities2())
                {
                    obj = dc.TBConfigs.Single(q => q.IDConfig.Equals(codigo));
                    return obj.ConvertToBE(1);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BEConfiguracao> ObterTodos(FEConfiguracao filter)
        {
            try
            {
                List<TBConfig> tbConfig = null;
                using (dc = new DBFastOdontoEntities2())
                {

                    var q = from e in dc.TBConfigs
                            where
                            (
                                (String.IsNullOrEmpty(filter.Nome) || e.DENomeClinica.Contains(filter.Nome)) &&
                                (!filter.Codigo.HasValue || e.IDConfig.Equals(filter.Codigo))
                            )
                            select e;

                    tbConfig = q.ToList();

                    List<BEConfiguracao> retorno = new List<BEConfiguracao>();

                    foreach (TBConfig de in tbConfig)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares

        public void MarcarNovidadeVisualizada()
        {
            using (dc = new DBFastOdontoEntities2())
            {
                TBConfig de = dc.TBConfigs.Single();
                de.NovidadeVisualizada = true;

                dc.SaveChanges();
            }
        }

        private void Incluir(BEConfiguracao entidade)
        {
            try
            {
                using (dc = new DBFastOdontoEntities2())
                {
                    TBConfig de = new TBConfig();
                    de.ConvertFromBE(entidade);

                    dc.TBConfigs.AddObject(de);
                    dc.SaveChanges();

                    entidade.Codigo = de.IDConfig;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BEConfiguracao entidade)
        {
            try
            {
                TBConfig entidadeBanco = new TBConfig();
                entidadeBanco.ConvertFromBE(entidade);

                using (dc = new DBFastOdontoEntities2())
                {
                    dc.TBConfigs.Attach(entidadeBanco);
                    dc.ObjectStateManager.ChangeObjectState(entidadeBanco, EntityState.Modified);

                    dc.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
